package cn.iocoder.yudao.module.mqtt.framework.util;

import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import lombok.extern.slf4j.Slf4j;

/**
 * 租户上下文工具类
 * 统一处理租户上下文操作
 *
 * @author 芋道源码
 */
@Slf4j
public class TenantContextUtil {

    /**
     * 在租户上下文中执行操作
     * 如果当前没有租户上下文，则忽略租户
     *
     * @param operation 要执行的操作
     * @param <T> 返回值类型
     * @return 操作结果
     */
    public static <T> T executeWithTenantContext(TenantOperation<T> operation) {
        Long originalTenantId = TenantContextHolder.getTenantId();
        boolean needIgnore = originalTenantId == null;
        
        try {
            if (needIgnore) {
                TenantContextHolder.setIgnore(true);
            }
            
            return operation.execute();
        } catch (Exception e) {
            log.error("在租户上下文中执行操作失败", e);
            throw e;
        } finally {
            if (needIgnore) {
                TenantContextHolder.clear();
            }
        }
    }

    /**
     * 在租户上下文中执行操作（无返回值）
     * 如果当前没有租户上下文，则忽略租户
     *
     * @param operation 要执行的操作
     */
    public static void executeWithTenantContext(TenantVoidOperation operation) {
        Long originalTenantId = TenantContextHolder.getTenantId();
        boolean needIgnore = originalTenantId == null;
        
        try {
            if (needIgnore) {
                TenantContextHolder.setIgnore(true);
            }
            
            operation.execute();
        } catch (Exception e) {
            log.error("在租户上下文中执行操作失败", e);
            throw e;
        } finally {
            if (needIgnore) {
                TenantContextHolder.clear();
            }
        }
    }

    /**
     * 带返回值的租户操作接口
     */
    @FunctionalInterface
    public interface TenantOperation<T> {
        T execute();
    }

    /**
     * 无返回值的租户操作接口
     */
    @FunctionalInterface
    public interface TenantVoidOperation {
        void execute();
    }
} 